﻿using System;
using System.Collections.Generic;
using Acaweb.Data.Contracts;
using Acaweb.Model.Entities;
using Acaweb.Model.Entities.DatosCompuestos;
using Spring.Stereotype;
using Spring.Transaction.Interceptor;
using System.Linq;

namespace Acaweb.Data.Dao.NHibernate
{
    [Repository]
    public class EstudiantesDao : HibernateDao<Estudiantes, int>, IEstudiantesDao
    {
        [Transaction(ReadOnly = true)]
        public IList<Estudiantes> GetAll()
        {
            return GetAll<Estudiantes>();
        }

        [Transaction(ReadOnly = true)]
        public IList<Estudiantes> GetByMunicipio(int Municipio)
        {
            return this.Session.QueryOver<Estudiantes>().Where(t => t.DatosCorreo.Municipio.CodigoMunicipio == Municipio).List();
        }

        [Transaction(ReadOnly = true)]
        public IList<Estudiantes> GetByPlanesEstudios(int PlanEstudio)
        {
            return this.Session.QueryOver<Estudiantes>().Where(t => t.CodigoPlan == PlanEstudio).List();
        }

        [Transaction(ReadOnly = true)]
        public Estudiantes GetByCodigoEstudiante(int CodigoEstudiante)
        {
            return this.Session.QueryOver<Estudiantes>().Where(t => t.CodigoEstudiante == CodigoEstudiante).List().First();
        }

        public int LastIndex()
        {
            return Session.QueryOver<Estudiantes>().Where(t => t.CodigoEstudiante > 1065285).List().ToList().Max(t => t.CodigoEstudiante) + 1;
        }

        public IList<Estudiantes> GetByEstadoEstudiante(EstadoEstudiante Estado, int skip, int limit)
        {
            return Session.QueryOver<Estudiantes>().Where(t => t.EstadoEstudiante == Estado).Skip(skip).Take(limit).List();
        }

        public IList<Estudiantes> GetByDocumentoIdentidad(int DocumentoIdentidad)
        {
            object ob = Session.QueryOver<Estudiantes>().Where(t => t.Identificacion.NumeroDocumentoIdentidad == DocumentoIdentidad).List();
            return Session.QueryOver<Estudiantes>().Where(t => t.Identificacion.NumeroDocumentoIdentidad == DocumentoIdentidad).List();
        }

        public void _Update(Estudiantes Estudiante)
        {
            string SQL = GenDatosAdicionalQuery(Estudiante);
            global::NHibernate.ISQLQuery Query = Session.CreateSQLQuery(SQL);
            Query.ExecuteUpdate();

            SQL = GenDatosBasicosQuery(Estudiante);
            Query = Session.CreateSQLQuery(SQL);
            Query.ExecuteUpdate();
        }

        private string GenDatosAdicionalQuery(Estudiantes Estudiante)
        {
            string Query = string.Format(@"Update RAP_DATOS_ADICIONALES ESTUDIANTES SET SALARIO = {0}, CELULAR = {1},ESTADO_CIVIL ='{2}', PADRE_ALUMNO ='{3}', TELEFONO_LABORAL_PADRE = {4}, EMAIL_PADRE = '{5}', CELULAR_PADRE = {6}, OCUPACION_PADRE ='{7}', NOMBRE_EMPRESA_PADRE= '{8}', MADRE_ALUMNO = '{9}', TELEFONO_LABORAL_MADRE = {10}, EMAIL_MADRE = '{11}', CELULAR_MADRE = {12}, OCUPACION_MADRE = '{13}', NOMBRE_EMPRESA_MADRE ='{14}', NOMBRE_CONYUGE = '{15}', TELEFONO_EMPRESA_CONYUGE = {16}, NOMBRE_EMPRESA_CONYUGE='{17}', ESTRATO_SOCIOECONOMICO={18}, DIRECCION_PADRES='{19}' WHERE CODIGO_INTERNO = {20}",
                Estudiante.Salario, Estudiante.Celular,
                Estudiante.EstadoCivil.ToString(),
                Estudiante.DatosPadre != null ? Estudiante.DatosPadre.Nombre : "",
                Estudiante.DatosPadre != null ? Estudiante.DatosPadre.DatosLaborales != null ? Estudiante.DatosPadre.DatosLaborales.DatosEmpresa.Telefono.ToString() : "0" : "0",
                Estudiante.DatosPadre != null ? Estudiante.DatosPadre.Email : "",
                Estudiante.DatosPadre != null ? Estudiante.DatosPadre.Celular.ToString() : "0",
                Estudiante.DatosPadre != null ? Estudiante.DatosPadre.Ocupacion : "",
                Estudiante.DatosPadre != null ? Estudiante.DatosPadre.DatosLaborales != null ? Estudiante.DatosPadre.DatosLaborales.NombreEmpresa : "" : "",
                Estudiante.DatosMadre != null ? Estudiante.DatosMadre.Nombre : "",
                Estudiante.DatosMadre != null ? Estudiante.DatosMadre.DatosLaborales != null ? Estudiante.DatosMadre.DatosLaborales.DatosEmpresa.Telefono.ToString() : "0" : "0",
                Estudiante.DatosMadre != null ? Estudiante.DatosMadre.Email : "",
                Estudiante.DatosMadre != null ? Estudiante.DatosMadre.Celular.ToString() : "0",
                Estudiante.DatosMadre != null ? Estudiante.DatosMadre.Ocupacion : "",
                Estudiante.DatosMadre != null ? Estudiante.DatosMadre.DatosLaborales != null ? Estudiante.DatosMadre.DatosLaborales.NombreEmpresa : "" : "",
                Estudiante.Conyugue != null ? Estudiante.Conyugue.Nombre : "",
                Estudiante.Conyugue != null ? Estudiante.Conyugue.DatosLaborales != null ? Estudiante.Conyugue.DatosLaborales.DatosEmpresa.Telefono.ToString() : "0" : "0",
                Estudiante.Conyugue != null ? Estudiante.Conyugue.DatosLaborales != null ? Estudiante.Conyugue.DatosLaborales.NombreEmpresa : "" : "",
                Estudiante.EstratoSocioeconomico,
                Estudiante.DireccionPadres,
                Estudiante.CodigoInterno);
            return Query;
        }

        private string GenDatosBasicosQuery(Estudiantes Estudiante)
        {
            string Query = string.Format(@"Update RAP_DATOS_BASICOS SET DIRECCION_CORREO = '{0}', TELEFONO_CORREO = {1}, E_MAIL='{2}' WHERE CODIGO_INTERNO = {3}",
                Estudiante.DatosCorreo.Direccion, Estudiante.DatosCorreo.Telefono, Estudiante.Email, Estudiante.CodigoInterno);

            return Query;
        }
    }
}